20691
6304
이 질문에 이미 답변이 있습니다.
오버로드 된 연산자에 암시 적 변환이 없습니다.
(2 답변)
7 년 전에 문을 닫았습니다.
기본 유형에 대한 간단한 래퍼를 작성 중이며 표준 연산자를 너무 많이 작성하지 않도록 노력하고 있습니다. 암시 적 형식 변환이 도움이되기를 바랐지만 그렇지 않습니다. 다음은 제거 된 예입니다.
구조체 Int
{
int _i;
Int (int i = 0) : _i {i} {}
Int 연산자 + (const Int & rhs) {return _i + rhs._i;}
};
int main (int argc, char * argv [])
{
(무효) (Int (1) + 2); // 좋아
(무효) (2 + Int (1)); // 오류 : 이진 표현식에 대한 유효하지 않은 피연산자 ( 'int'및 'Int')
}
llvm을 사용하고 있습니다. 메인의 첫 번째 줄은 잘 컴파일됩니다. 두 번째는 오류를 발생시킵니다. 이제 두 번째 줄에서 2가 암시 적으로 Int (2)로 변환되고 operator +를 호출하기를 바랐습니다. 왜 그런 일이 일어나지 않습니까? 암시 적 변환이 첫 번째 줄에서 발생하는 이유는 무엇입니까? 
사용 가능한 유일한 operator +는 operator + (Int &) (이 인스턴스에 대해 Int의 암시 적 첫 번째 매개 변수가 있음)이기 때문에 첫 번째 줄에서 발생합니다. 두 번째 줄은 첫 번째 매개 변수가 int이고 작업을 시도하기 전에 변환해야한다는 단서가 없기 때문에 실패합니다 (Int :: operator +를 사용해야 함을 알지 못함).
운영자를 비회원 친구 기능 (http://ideone.com/YCf7wX)으로 설정하여 이러한 문제를 피할 수 있습니다.
구조체 Int
{
int _i;
Int (int i = 0) : _i {i} {}
friend Int 연산자 + (const Int & lhs, const Int & rhs);
};
Int 연산자 + (const Int & lhs, const Int & rhs)
{
return lhs._i + rhs._i;
}
int main ()
{
Int i;
나는 + 5;
5 + 나;
반환 0;
}
|
찾고있는 답변이 아닙니까? C ++ 연산자-키워드 암시 적 변환 태그가 지정된 다른 질문을 찾아 보거나 직접 질문하십시오.